home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / misc / emu / arosdev.lha / AROS / rom / exec / execstrap_init.c < prev    next >
C/C++ Source or Header  |  1997-02-03  |  8KB  |  303 lines

  1. /*
  2.     (C) 1995-97 AROS - The Amiga Replacement OS
  3.     $Id: execstrap_init.c,v 1.9 1997/02/03 02:57:19 ldp Exp $
  4.  
  5.     Desc:
  6.     Lang: english
  7. */
  8. #include <exec/types.h>
  9. #include <exec/resident.h>
  10. #include <exec/nodes.h>
  11. #include <exec/execbase.h>
  12. #include <hardware/cia.h>
  13.  
  14. #include <proto/exec.h>
  15.  
  16. #include "exec_extfuncs.h"
  17.  
  18. #define SetFunc(offset,name) \
  19.     SetFunction((struct Library *)SysBase, (offset * -6), (APTR)&AROS_SLIB_ENTRY(name,Exec));
  20.  
  21. /*
  22.     Architecture dependent function variations:
  23. */
  24. extern void AROS_SLIB_ENTRY(GetCC_10,Exec)();
  25. extern void AROS_SLIB_ENTRY(CacheClearU_20,Exec)();
  26. extern void AROS_SLIB_ENTRY(CacheClearU_40,Exec)();
  27. extern void AROS_SLIB_ENTRY(CachePreDMA_40,Exec)();
  28. extern void AROS_SLIB_ENTRY(CachePostDMA_30,Exec)();
  29. extern void AROS_SLIB_ENTRY(CachePostDMA_40,Exec)();
  30.  
  31. /*
  32.     TODO:
  33.  
  34.     Expand, improve and generally make the world a better place. :)
  35. */
  36.  
  37. int entry(void)
  38. {
  39.     return 0;
  40. }
  41.  
  42. extern const char name[];
  43. extern const char version[];
  44. extern int start(void);
  45. extern const char end;
  46.  
  47. struct Resident resident =
  48. {
  49.     RTC_MATCHWORD,
  50.     &resident,
  51.     (APTR)&end,
  52.     RTF_COLDSTART,
  53.     1,            /* version */
  54.     NT_KICKMEM,
  55.     106,        /* Just above exec.library.
  56.                Because exec is RTF_SINGLETASK, and this is
  57.                RTF_COLDSTART, we'll still be started after
  58.                exec */
  59.     (char *)name,
  60.     (char *)&version[6],
  61.     &start
  62. };
  63.  
  64. const char name[] = "exec.strap";
  65. const char version[] = "$VER: AROS exec.strap 1.2 (2.2.97)";
  66.  
  67. int start(void)
  68. {
  69.     struct ExecBase *SysBase;
  70.     register ULONG x, y;
  71.     UWORD *color00 = (void *)0xdff180;
  72.     UBYTE *ciapra = (void *)0xbfe001;
  73.     UWORD cpuflags;
  74.  
  75.     if (!(*ciapra & CIAF_GAMEPORT0))
  76.     {
  77.     /* If left mouse button pressed: don't start this time */
  78.     /* DEBUGGING FEATURE: will probably be removed */
  79.     return 0;
  80.     }
  81.  
  82.     if (SysBase->LibNode.lib_Version < 37)
  83.     {
  84.     /* Refuse to run on anything less than ROM 2.04 */
  85.     return 0;
  86.     }
  87.  
  88.     /* High-tech display tricks (blue effects) :-) */
  89.     for (x=0; x<1000; x++)
  90.     {
  91.     for (y = 200; y; y--) *color00 = 0x00f;
  92.     for (y = 200; y; y--) *color00 = 0x000;
  93.     }
  94.  
  95.     SysBase = *(void **)4;
  96.     cpuflags = SysBase->AttnFlags;
  97.  
  98.     /* First patch SetFunction itself. */
  99. #if 0
  100.     /* Produces very strange code. "c:version" prints
  101.        "Kickstart 39.106. Could not find version information for ''" and fails:
  102.     */
  103.     SetFunc( 70, SetFunction);
  104. #endif
  105.  
  106.     /*
  107.     The biggie: SetFunction() as many library vectors as possible.
  108.     Protection from multitasking is provided by SetFunction (Forbid/Permit).
  109.  
  110.     Some functions are safe to call even from interrupts, so protect these
  111.     with Disable/Enable:
  112.     Alert/Cause/Disable/Enable/FindName/FindPort/FindTask/PutMsg/ReplyMsg/Signal/
  113.     AddHead/AddTail/Enqueue/RemHead/RemTail/Insert/Remove ... any more?
  114.     */
  115.     Disable();
  116.  
  117.     SetFunc( 20, Disable);
  118.     SetFunc( 22, Forbid);
  119.  
  120. #if 0
  121.     /* "Some trouble prevented CycleToMenu to initialize itself properly"
  122.        Related to the microkernel */
  123.     SetFunc( 23, Permit);
  124. #endif
  125.  
  126. #if 0
  127.     /*
  128.     Any ixemul program that uses wildcards on the command line will crash the Amiga.
  129.     Ixemul is responsible for this; there is a code-fragment in
  130.     ixemul/library/__cli_parse.c to check out why our Insert() fails.
  131.     */
  132.     SetFunc( 39, Insert);
  133. #endif
  134.  
  135.     SetFunc( 40, AddHead);
  136.     SetFunc( 41, AddTail);
  137.     SetFunc( 42, Remove);
  138.     SetFunc( 43, RemHead);
  139.     SetFunc( 44, RemTail);
  140.     SetFunc( 45, Enqueue);
  141.     SetFunc( 46, FindName);
  142.     SetFunc( 49, FindTask);
  143.     SetFunc( 65, FindPort);
  144.     SetFunc( 61, PutMsg);
  145.     SetFunc( 63, ReplyMsg);
  146.  
  147. #if 0
  148.     /* The "move.w ccr,d0" should really be implemented as part of the jumptable, for speed.
  149.        Is this desirable? */
  150.     if ((cpuflags & AFF_68010) == AFF_68010)
  151.     SetFunc( 88, GetCC_10);
  152. #endif
  153.  
  154.     /*
  155.        BTW:  What bit(s) is (are) set for the MC68060?
  156.        BTW2: They would really be set by the 68060.library, which will obviously
  157.              not have executed at this point in the reset-procedure.
  158.        BTW3: If there is an agreed upon bit for the 68060, we could examine the
  159.              type of processor for ourselves in exec.strap, and update AttnFlags
  160.              accordingly.
  161.        BTW4: The 68060 can be recognized by its Processor Configuration Register (PCR).
  162.              This register also contains the bit to enable Superscalar Operation,
  163.              which we could set at this point in the reset-procedure to speed
  164.              things up considerably (if nothing breaks).
  165.        BTW5: For the MC68060, we could also enable the Branch Cache at this point.
  166.     */
  167.  
  168.     /* Pre-stuff these vectors for 68000/68010 use. */
  169.     SetFunc(106, CacheClearU);
  170.     SetFunc(127, CachePreDMA);
  171.     SetFunc(128, CachePostDMA);
  172.  
  173.     /*
  174.     Test for increasing processor types. We could also let these functions
  175.     test ExecBase->AttnFlags for themselves and decide which action to take.
  176.     That would mean less work here, but more work in the function that has
  177.     to be repeated everytime it's called.
  178.     */
  179.     if ((cpuflags & AFF_68020) == AFF_68020)
  180.     {
  181.     SetFunc(106, CacheClearU_20);
  182.  
  183.     if ((cpuflags & AFF_68030) == AFF_68030)
  184.     {
  185.         SetFunc(128, CachePostDMA_30);
  186.  
  187.         if ((cpuflags & AFF_68040) == AFF_68040)
  188.         {
  189.         SetFunc(106, CacheClearU_40);
  190.         SetFunc(127, CachePreDMA_40);
  191.         SetFunc(128, CachePostDMA_40);
  192.         }
  193.     }
  194.     }
  195.     Enable();
  196.  
  197.     SetFunc( 12, InitCode);
  198. #if 0
  199.     /* Fails, presumably on the AROS_ALIGN restrictions: */
  200.     SetFunc( 13, InitStruct);
  201. #endif
  202.     SetFunc( 14, MakeLibrary);
  203.     SetFunc( 15, MakeFunctions);
  204.     SetFunc( 16, FindResident);
  205.     SetFunc( 17, InitResident);
  206.     SetFunc( 27, SetIntVector);
  207.     SetFunc( 28, AddIntServer);
  208.     SetFunc( 29, RemIntServer);
  209. #if 0
  210.     /* Computer boots ok, but then programs fail. KingCON allows you to enter
  211.        a command, but if you enter return, hangs. No other keypresses are
  212.        accepted; mclk (clock window) still runs, though: */
  213.     SetFunc( 33, AllocMem);
  214.     SetFunc( 35, FreeMem);
  215. #endif
  216.     SetFunc( 36, AvailMem);
  217. #if 0
  218.     /* "Could not mount PC0:": */
  219.     SetFunc( 37, AllocEntry);
  220.     /* Also disabled, as a dtor to AllocEntry */
  221.     SetFunc( 38, FreeEntry);
  222. #endif
  223.     SetFunc( 51, SetSignal);
  224.     SetFunc( 55, AllocSignal);
  225.     SetFunc( 56, FreeSignal);
  226.     SetFunc( 59, AddPort);
  227.     SetFunc( 60, RemPort);
  228.     SetFunc( 62, GetMsg);
  229. #if 0
  230.     /* Essentially works, but for some reason is not fast enough to detect a
  231.        CONNECT string from my modem with ppp.device. Or something. */
  232.     SetFunc( 64, WaitPort);
  233. #endif
  234.     SetFunc( 66, AddLibrary);
  235.     SetFunc( 67, RemLibrary);
  236.     SetFunc( 68, OldOpenLibrary);
  237. #if 0
  238.     /* Guru 01 00 00 0f (AN_BadFreeAddr): */
  239.     SetFunc( 69, CloseLibrary);
  240. #endif
  241.     SetFunc( 71, SumLibrary);
  242.     SetFunc( 72, AddDevice);
  243.     SetFunc( 73, RemDevice);
  244.     SetFunc( 76, DoIO);
  245.     SetFunc( 77, SendIO);
  246.     SetFunc( 78, CheckIO);
  247.     SetFunc( 79, WaitIO);
  248.     SetFunc( 80, AbortIO);
  249.     SetFunc( 81, AddResource);
  250.     SetFunc( 82, RemResource);
  251.     SetFunc( 83, OpenResource);
  252. #if 0
  253.     /* Hangs just after accessing HD for the first time. Related to BCPL/BSTR
  254.        handling? */
  255.     SetFunc( 87, RawDoFmt);
  256. #endif
  257.     SetFunc( 89, TypeOfMem);
  258.     SetFunc( 92, OpenLibrary);
  259.     SetFunc( 93, InitSemaphore);
  260. #if 0
  261.     /* Can only be patched if we have control over the microkernel: */
  262.     SetFunc( 94, _ObtainSemaphore);
  263. #endif
  264.     SetFunc( 96, AttemptSemaphore);
  265.     SetFunc( 99, FindSemaphore);
  266.     SetFunc(100, AddSemaphore);
  267.     SetFunc(101, RemSemaphore);
  268.     SetFunc(103, AddMemList);
  269.     SetFunc(109, CreateIORequest);
  270.     SetFunc(110, DeleteIORequest);
  271.     SetFunc(111, CreateMsgPort);
  272.     SetFunc(112, DeleteMsgPort);
  273. #if 0
  274.     /* Can only be patched if we have control over the microkernel: */
  275.     SetFunc(113, _ObtainSemaphoreShared);
  276. #endif
  277.     SetFunc(114, AllocVec);
  278.     SetFunc(115, FreeVec);
  279.     SetFunc(120, AttemptSemaphoreShared);
  280.  
  281.     if (SysBase->LibNode.lib_Version >= 39)
  282.     {
  283.     /* V39+ functions: */
  284.     SetFunc(129, AddMemHandler);
  285.     SetFunc(130, RemMemHandler);
  286.     SetFunc(135, TaggedOpenLibrary);
  287.     }
  288.     /* We don't have to clear any caches, SetFunction takes care of them. */
  289.  
  290.     /*
  291.     High-tech display tricks (green effects) :-)
  292.     */
  293.     for (x=0; x<1000; x++)
  294.     {
  295.     for (y = 200; y; y--) *color00 = 0x0f0;
  296.     for (y = 200; y; y--) *color00 = 0x000;
  297.     }
  298.  
  299.     return 0;
  300. }
  301.  
  302. const char end = 0;
  303.